package com.xxx.yuedong.mall.util;


import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;

@Component
@Slf4j
public class QuartzUtil {

    /**
     * @Resource注解注入Scheduler对象，Scheduler是Quartz的核心调度器，用于管理和执行定时任务。
     */
    @Resource
    private Scheduler scheduler;

    /**
     * 添加一个定时任务
     * @param jobDetail 包含要执行的作业的详细信息，如作业类、作业名等。
     * @param jobName 作业名称。
     * @param jobGroupName 作业所属的分组名称。
     * @param start 定时任务的启动时间。
     */
    public void addJob(JobDetail jobDetail, String jobName, String jobGroupName, Date start) {
        try {
            /**
             * 在方法中，首先创建一个Trigger对象，通过TriggerBuilder.newTrigger()方法创建，
             * 并设定触发器的标识（使用jobName和jobGroupName），
             * 以及触发规则（使用SimpleScheduleBuilder创建一个简单的触发规则，即无论是否错过触发时间点，都立即执行）和启动时间。
             * 然后，使用scheduler.scheduleJob()方法将作业和触发器关联起来，并将定时任务添加到调度器中。
             */
            Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroupName)
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule().withMisfireHandlingInstructionFireNow())
                    .startAt(start).build();
            scheduler.scheduleJob(jobDetail, trigger);
            log.debug("成功添加" + jobName + "定时器");
        } catch (SchedulerException e) {
            log.error("定时器添加失败",e);
        }
    }

    /**
     * 删除一个定时任务
     * @param jobName  要删除的作业名称。
     * @param jobGroupName  要删除的作业所属的分组名称。
     */
    public void deleteJob(String jobName, String jobGroupName) {
        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);
        try {
            scheduler.resumeTrigger(triggerKey);
            scheduler.unscheduleJob(triggerKey);
            scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));
            log.debug("成功删除" + jobName + "定时器");
        } catch (SchedulerException e) {
            log.error("定时器删除失败",e);
        }

    }
}
